/******************************************************************************\
    BaseThread.cpp contains a base class for threads.
    Copyright (C) 2008  Victor Vinogradov (fly3333@gmail.com)

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
\******************************************************************************/

#include <winsock2.h>
#include ".\BaseThread.h"

cBaseThread::cBaseThread( bool auto_delete )
	: AutoDelete( auto_delete )
{
	Thread.Create( NULL, 0, &ThreadFunction, this, CREATE_SUSPENDED );
}

cBaseThread::~cBaseThread()
{
	DWORD exit_code;
	Thread.GetExitCode( &exit_code );
	if( exit_code == STILL_ACTIVE )
		Thread.Terminate( 0 );
}

DWORD WINAPI cBaseThread::ThreadFunction( LPVOID lpParameter )
{
	cBaseThread *base_thread = ( cBaseThread * )lpParameter;

	unsigned long result = base_thread->Process();

	if( base_thread->AutoDelete )
		delete base_thread;

	return result;
}

HANDLE cBaseThread::Handle()
{
	return Thread;
}

cThread &cBaseThread::operator *()
{
	return Thread;
}

cThread *cBaseThread::operator ->()
{
	return &Thread;
}
